table of contents
SEMGET(2) | Podręcznik programisty Linuksa | SEMGET(2) |
NAZWA¶
semget - pobranie identyfikatora zestawu semaforów
SKŁADNIA¶
#include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h>
int semget(key_t key, int nsems, int semflg);
OPIS¶
Funkcja ta zwraca identyfikator zestawu semaforów, skojarzonego z parametrem key. Jeśli key ma wartość IPC_PRIVATE lub, gdy z wartością key nie jest skojarzony żaden istniejący zestaw semaforów, a w parametrze semflg został przekazany znacznik IPC_CREAT (tzn. semflg & IPC_CREAT jest niezerowe), to tworzony jest nowy zestaw semaforów nsems.
Znaczniki IPC_CREAT i IPC_EXCL przekazywane parametrem semflg pełnią tę samą rolę w obsłudze semaforów, co O_CREAT i O_EXCL w parametrze mode funkcji systemowej open(2): np. funkcja semget zgłosi błąd, jeśli w semflg przekazane zostaną obydwa znaczniki IPC_CREAT i IPC_EXCL, zaś zestaw semaforów identyfikowany kluczem key już będzie istnieć.
Podczas tworzenia, 9 najmniej znaczących bitów argumentu semflg określa prawa dostępu do zestawu semaforów (dla właściciela, grupy i innych). Prawa dostępu mają ten sam format i takie samo znaczenie, co parametr mode funkcji systemowych open(2) i creat(2) (bity praw uruchamiania nie są istotne dla semaforów, natomiast bity praw zapisu oznaczają możliwość zmiany wartości semaforów).
Podczas tworzenia nowego zestawu semaforów semget inicjalizuje strukturę semid_ds związaną z zestawem semaforów w następujący sposób:
- sem_perm.cuid oraz sem_perm.uid przypisany zostanie efektywny identyfikator użytkownika procesu wywołującego.
- sem_perm.cgid oraz sem_perm.gid przypisany zostanie efektywny identyfikator grupy procesu wywołującego.
- 9 najmniej znaczącym bitom pola sem_perm.mode zostaną przypisane ich odpowiedniki z parametru semflg.
- Polu sem_nsems przypisania zostanie, zawarta w parametrze nsems, liczba semaforów w zestawie.
- sem_otime przyjmie wartość 0.
- sem_ctime przypisany zostanie aktualny czas.
Parametr nsems może mieć wartość 0 (nie jest brany pod uwagę), jeśli nie będzie tworzony zestaw semaforów. W przeciwnym przypadku parametr nsems musi być większy od 0 i mniejszy lub równy maksymalnej liczbie semaforów w zestawie (SEMMSL).
Jeśli zestaw semaforów już istnieje, wówczas weryfikowane są prawa dostępu.
WARTOŚĆ ZWRACANA¶
W wyniku pomyślnego wykonania wywołania, funkcja zwróci identyfikator zestawu semaforów (nieujemną liczbę całkowitą). W przeciwnym przypadku zwróci -1, zaś zmiennej errno zostanie przypisany kod wskazujący rodzaj błędu.
BŁĘDY¶
W przypadku niepowodzenia, zmiennej errno zostanie przypisana jedna z następujących wartości:
- EACCES
- Zestaw semaforów identyfikowany kluczem key istnieje, ale proces wywołujący nie ma praw dostępu do niego.
- EEXIST
- Zestaw semaforów o identyfikatorze key istnieje, ale w parametrze semflg przekazane zostały jednocześnie oba znaczniki IPC_CREAT i IPC_EXCL.
- ENOENT
- Nie ma zestawu semaforów o identyfikatorze key, zaś znacznik IPC_CREAT nie został przekazany w parametrze semflg.
- EINVAL
- nsems jest mniejsze niż 0 lub większe niż ograniczenie liczby semaforów w zestawie (SEMMSL), lub zestaw semaforów, do któregoodnosi się key już istnieje a nsems jest większe niż liczba semaforów w tym zestawie.
- ENOMEM
- Zestaw semaforów powinien zostać utworzony, ale zabrakło pamięci na nową strukturę danych.
- ENOSPC
- Nastąpiła próba przekroczenia ograniczenia liczby zestawów (SEMMNI), lub łącznej liczby semaforów w systemie (SEMMNS).
UWAGI¶
Stała IPC_PRIVATE nie jest znacznikiem, tylko specjalną wartością typu key_t. Jeśli zostanie ona przekazana jako wartość parametru key, wówczas (w razie pomyślnego wykonania) funkcja systemowa pominie wszystko oprócz najmniej znaczących 9 bitów semflg, tworząc nowy zestaw semaforów, nie posiadający identyfikatora.
Występują następujące ograniczenia zasobów systemowych, związane z wywołaniem semget:
- SEMMNI
- Maksymalna liczba zestawów semaforów w systemie: zależna od polityki.
- SEMMSL
- Maksymalna liczba semaforów w zestawie: zależna od implementacji (aktualnie 500).
- SEMMNS
- Maksymalna liczba semaforów w systemie: zależna od polityki. Wartość większa niż SEMMSL * SEMMNI pozbawia to ograniczenie sensu.
USTERKI¶
Wybrana nazwa, IPC_PRIVATE, prawdopodobnie nie jest najszczęśliwsza. IPC_NEW w sposób bardziej przejrzysty odzwierciedlało by rolę tej wartości.
Struktury danych skojarzone z poszczególnymi semaforami z zestawu nie są inicjalizowane przez wywołanie systemowe. Aby zainicjalizować te struktury, należy następnie użyć dla tego zestawu semaforów wywołania semctl(2) z rozkazami SETVAL lub SETALL.
ZGODNE Z¶
SVr4, SVID. SVr4 dokumentuje dodatkowe stałe błędów: EFBIG, E2BIG, EAGAIN, ERANGE, EFAULT.
ZOBACZ TAKŻE¶
2002-01-04 | Linux 2.5 |